SPSS LAG 函数:用途与详解
在 SPSS 中,LAG
函数用于返回前一个个案的值。它主要用于每个受访者有多行数据的数据集。在这种情况下,它对于计算累计总和或计数非常有用。
SPSS LAG - 基础示例 1
使用 LAG
最基本的方法是 COMPUTE V1 = LAG(V2)
。 这将简单地计算一个(可能是新的)变量 V1
,其中包含 V2
上前一个个案的值。第一个屏幕截图说明了这一点。 它是运行以下 语法 的结果。由于第一个个案没有前一个个案,因此新变量上会有一个 系统缺失值 。
SPSS LAG 语法示例 1
***1. 创建数据.
**
data list free / id.
begin data
1 2 2 3 3 3 4 4 4 4
end data.
***2. 查找前一个个案的 id 值.
**
compute previous_id = lag(id).
exe.
SPSS LAG - 创建计数器
说明 LAG
如何工作的一个好方法是创建一个计数器变量。 对于每个 id
值,我们将创建一个变量,指示其数据的第 n 行。 我们将首先使用 [IF](/spss-if-command)
命令识别每个 id 的第一个记录,如下面的语法所示。 屏幕截图说明了它的工作原理。
***对于每个 id 的第一行,counter = 1.
**
if $casenum = 1 or id ne lag(id) counter = 1.
exe.
识别每个 id 值的首行
接下来,我们将完成我们的计数器。 这里需要理解的重要一点是,当 SPSS 执行数据转换时,个案会从上到下按顺序处理。 也就是说,SPSS 将从 $casenum = 1
开始,然后逐个个案地向下处理。 因此,在此过程中由 LAG
创建的值可能会被下一个个案使用。 下面的屏幕截图说明了 SPSS 处理以下语法时发生的三个步骤。 由于这些步骤通常需要几毫秒才能完成,因此您实际上看不到它们在正常情况下发生。
***2. 对于每个后续行,将计数器加 1.
**
if sysmis(counter) counter = lag(counter) + 1.
exe.
SPSS 从上到下按顺序处理个案
SPSS 长数据格式 (Long Data Format)
SPSS 长数据格式。 注意每个客户可以有一个或多个记录。
我们将继续使用实际示例,这些示例的级别会逐渐提高。 假设我们有以记录形式保存订单的数据,如上图所示。 请注意,每个客户可以有一行或多行数据。 这种格式通常称为 长数据格式 (long data format)。 与此相反,每个客户的数据位于一行上,称为 宽数据格式 (wide data format)。 关于这些数据的相关问题可能是:
- 客户多久下一次订单? 或者,一个客户的订单之间间隔多少天?
- 平均每个客户下多少订单?
- 客户花费多少钱?
我们将使用 LAG
函数来解答这些问题。
SPSS LAG 示例 - 订单之间的天数
运行以下语法将创建上一个屏幕截图中的数据,并找到一个客户的订单之间的天数。 请注意,必须首先以有意义的方式对记录进行排序。 接下来,if customer_id = lag(customer_id)
检查每个记录是否 不是 给定客户的第一个记录。 仅对于这些记录,才会计算 days_between_orders
。
SPSS LAG 语法示例 2
***1. 创建测试数据.
**
data list free / order_id (f2.0) order_date(edate10) customer_id invoice_amount (2f3.0).
begin data
1 26.09.2011 8 100 2 30.10.2011 8 100 3 28.12.2011 3 100 4 21.01.2012 12 150 5 26.01.2012 3 110
6 31.01.2012 7 140 7 16.02.2012 12 190 8 22.02.2012 12 30 9 23.02.2012 3 150 10 04.04.2012 12 50
end data.
***2. 按 customer_id 和 order_date 对记录进行排序.
**
sort cases customer_id order_date.
***3. 计算单个客户的订单之间的天数.
**
if customer_id = lag(customer_id) days_between_orders = datediff(order_date,lag(order_date),'days').
exe.
SPSS LAG 示例 - 每个客户的累计订单
现在,我们将创建一个每个客户的累计订单计数。 我们将首先将这个新变量设置为每个客户的第一个记录的 1
。 这是通过 if $casenum = 1 or lag(customer_id) ne customer_id
选择的。 接下来,如果每个连续记录属于同一客户,我们将对其加 1
。 此条件由 if customer_id = lag(customer_id)
暗示。 请注意,我们利用了 SUM(SYSTEM MISSING,X) = X
这一事实。 我们不能在此处使用 +
运算符,因为 SYSTEM MISSING + X = SYSTEM MISSING
。
SPSS LAG 语法示例 3
***1. 对于每个 customer_id 的第一条记录,cumulative_orders = 1.
**
if $casenum = 1 or lag(customer_id) ne customer_id cumulative_orders = 1.
exe.
***2. 对于每个连续记录,将 cumulative_orders 加 1.
**
if customer_id = lag(customer_id) cumulative_orders = sum(lag(cumulative_orders),1).
exe.
SPSS LAG 示例 - 累计支出
最后,我们将创建累计支出。 这与前面的示例非常相似。 我们现在不是将 1
添加到每个连续记录,而是添加 invoice_amount
。
SPSS LAG 语法示例 4
***1. 对于每个 customer_id 的第一条记录,cumulative_amount = invoice_amount.
**
if $casenum = 1 or lag(customer_id) ne customer_id cumulative_amount = invoice_amount.
exe.
***2. 第二条到第 n 条记录的累计金额.
**
if customer_id = lag(customer_id) cumulative_amount = sum(invoice_amount,lag(cumulative_amount)).
exe.
原始变量和使用 LAG 创建的变量
注意事项
- 根据经验,在使用
LAG
的命令之后,始终立即运行EXECUTE
。 这是您真正需要运行EXECUTE
或过程的极少数情况之一。 这样做的原因是相当技术性的,但对于那些想知道的人:LAG
总是在所有其他转换之后执行。 这意味着命令的执行顺序可能与指定它们的顺序不同。 因此,如果在后续命令中使用受LAG
影响的变量,则后者很可能使用“错误”的值,因为LAG
尚未发生。 - 为了获得第 n 个前一个个案的值,请使用
LAG(...,n)
。 请注意,n
必须是正整数。 也就是说,您不能使用LAG(v1,-1)
从 下一个 个案而不是上一个个案获取值。
从下一个个案获取值
LAG
不能轻易地从下一个个案而不是上一个个案访问值。 如果您确实需要下一个个案的值,一种选择是反转个案的顺序并仍然使用LAG
。- 您还可以使用
CREATE
或SHIFT VALUES
从下一个个案获取值。 请注意,这些是过程(而不是函数)。 这意味着您不能在IF
命令中使用它们来评估条件,就像我们在本教程中讨论的大多数示例中所做的那样。
其他示例
在编写本教程后不久,我们收到了一些更具挑战性的问题,这些问题主要通过使用 LAG
和 [IF](/spss-if-command)
语句来解决。 我们将在下面逐步介绍它们。
SPSS Lag - 识别会话
“我们进行了一项实验,其中向受访者展示了随机图片。 每张图片可能会或可能不会重复出现。 单个图片的后续演示构成一个 会话 (session)。 我们如何将会话添加到我们的数据中?”
下面的语法侧重于逐步解释事物的运作方式。 这不是回答问题的最快选择。 有关缩短它的方法之一,请参阅 Compute A = B = C。
SPSS LAG 语法示例 5
***1. 创建数据.
**
data list free / sequence id picture.
begin data.
1 1 1 2 1 4 3 1 3 4 1 4 5 1 4 6 1 4 7 1 1 8 1 1 9 1 3 10 1 3 1 2 3 2 2 3 3 2 3
4 2 4 5 2 2 6 2 4 7 2
1 8 2 2 9 2 3 10 2 1 3 1 2 3 3 3 3 3 4 3 4 5 3 4 6 3 2 7 3 1 8 3 4 9 3 3 10
3 3
end data.
variable labels id 'Respondent id'.
***.2 对于每个受访者的第一行数据,Session = 1.
**
if $casenum eq 1 or id ne lag(id) session = 1.
exe.
***3. 检测切换(同一受访者的不同图片).
**
if $casenum gt 1 and id eq lag(id) and picture ne lag(picture) switch = 1.
exe.
***4. 每次切换时,将会话数加 1.
**
if $casenum ne 1 and id eq lag(id) session = sum(lag(session),switch).
exe.
***5. 可选,删除 "switch".
**
delete variables switch.
SPSS Lag - 统计家庭中的选票
“我们收集了关于家庭中不同人的数据。 我们的一个变量 vote
是每个受访者在被问及时会投票支持的政党。 我们想通过计算 vote
上不同值的数量来估计家庭的政治异质性。 我们该怎么做?”
请注意步骤 6 中 [AGGREGATE](/spss-aggregate-command)
的使用。 与前面的示例一样,此语法可以缩短。
SPSS LAG 语法示例 6
***1. 创建数据.
**
data list free / household_member household vote.
begin data
1 1 4 1 2 3 2 2 3 3 2 1 4 2 1 5 2 4 1 3 3 2 3 4 1 4 1 2 4 4 1 5 2 2 5 2 3 5 3
4 5 4 5 5 1
end data.
***2. 按家庭,然后按投票排序.
**
sort cases by household vote.
***3. 对于家庭的第一个成员,counter = 1.
**
if $casenum = 1 or household ne lag(household) counter = 1.
exe.
***4. 识别切换(家庭内的投票变化).
**
if $casenum ne 1 and household = lag(household) and vote ne lag(vote) switch = 1.
exe.
***5. 每次切换时,将计数器加 1.
**
if $casenum ne 1 and household = lag(household) counter = sum(lag(counter),switch).
exe.
***6. 家庭中不同的选票 = max(counter).
**
aggregate outfile = * mode addvariables
/break household
/different_votes_in_household = max(counter).
***7. 可选删除临时帮助变量.
**
delete variables counter switch.